/*
题目: 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 */
public class Trap {
    public int trap(int[] height) {
        //单调栈
        Stack<Integer> stack = new Stack<> ();
        int water = 0;

        for (int i = 0; i < height.length; i++) {
            while (!stack.isEmpty() && height[stack.peek()] < height[i]) {
                int cur = stack.pop();//得到当前下标
                int curHeight = height[cur];//得到当前高度
                if (stack.isEmpty()) {
                    break;
                }

                int left = stack.peek();
                int width = i - left - 1;//得到弹出的水的宽度

                water += (Math.min(height[i], height[left]) - curHeight) * width;
            }
            stack.push(i);
        }

        return water;
    }
}
